/*Copyright (c) 2012 Nicolás Zalaquett

Permission is hereby granted, free of charge, to any
person obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the
Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the
Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice
shall be included in all copies or substantial portions of
the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.*/
package extrae;

import javafx.scene.CustomNode;
import javafx.geometry.HPos;
import javafx.scene.Cursor;
import javafx.scene.Group;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.scene.Node;
import javafx.scene.control.TextBox;
import java.io.Serializable;

/**
 * @author lojkoro
 */

   /*SensorNode: Nodo para la seleccion de un sensor digital a utilizar
    *Incluye opción de cambio de tamaño de regleta (lo que se
    *utilizará en las mediciones de velocidad). También incluye
    *una funcion para extraer la información necesaria para crear un
    *sensorDIG desde este nodo visual*/
public class sensorNode extends CustomNode{
    public var nombre:String;
    public var imagen:String;
    public var tipoInterrupcion:Boolean;
    public var regleta:Integer;
    public var visibility:Boolean=true;
    public var cambRegleta:TextBox=TextBox {
                        font:Font { size: 12 }
                        text:"{regleta}"
                        cursor: Cursor.HAND
                    };
    def cambioValRegleta=bind cambRegleta.text on replace {
        var val=Integer.parseInt(cambRegleta.text);
        if(val>0){
        regleta=val;
    }
    }
    var detalles: Group = Group {
        visible: true
        layoutX: 5
        layoutY: 35
        content: [
            VBox {
                hpos: HPos.LEFT
                content: [
                    Text {
                        fill: Color.BLACK
                        font:Font { size: 12 }
                        content: bind "{nombre}"
                        cursor: Cursor.HAND
                         },
                    Text {
                        fill: Color.BLACK
                        font:Font { size: 12 }
                        content: bind "Interrupción : {if(tipoInterrupcion){"Subida"}else{"Cambio"}}"
                        cursor: Cursor.HAND
                    }
                    Text {
                        fill: Color.BLACK
                        font:Font { size: 12 }
                        content: bind "Tamaño Regleta: {regleta} [mm]"
                        cursor: Cursor.HAND
                    },cambRegleta
                    ,
                ]
            }
            ImageView {
                layoutX: 420-100
                image: bind Image {
                    height: 70
                    width: 80
                    url: "{__DIR__}recursos/{imagen}"
                }
            }
        ]
        cursor: Cursor.HAND
    }
    public function clonar(sen:sensorNode):Void{
        nombre=sen.nombre;
        imagen=sen.imagen;
        tipoInterrupcion=sen.tipoInterrupcion;
        regleta=sen.regleta;
    }
    public override function create():Node {
        return Group {
            content: [
                detalles,
            ]
        };
    }
    public function hacer():sensorDIG{
        var sens:sensorDIG=sensorDIG{};
        sens.nombre=nombre;
        sens.imagen=imagen;
        sens.regleta=regleta;
        sens.tipoInterrupcion=tipoInterrupcion;
        return sens;
    }
}
   /*SensorDIG: Clase que define un sensor digital. Incluye una
    *función de copia*/
public class sensorDIG{
    public var nombre:String="";
    public var imagen:String="";
    public var tipoInterrupcion:Boolean=true;
    public var regleta:Integer=0;
    public function copiar(s:sensorDIG):Void{
        nombre=s.nombre;
        imagen=s.imagen;
        tipoInterrupcion=s.tipoInterrupcion;
        regleta=s.regleta;
    }

}
   /*SensorNodeAN: Nodo para la seleccion de un sensor analogo a utilizar
    *Incluye una funcion para extraer la información necesaria para crear un
    *sensorAN desde este nodo visual*/
public class sensorNodeAN extends CustomNode{
    public var nombre:String;
    public var imagen:String;
    public var unidades:String;
    public var corte:Number;
    public var pendiente:Number;
    public var resolucion:Number;
    public var rangoMin:Number;
    public var rangoMax:Number;
    public var visibility:Boolean=true;
    var detalles: Group = Group {
        visible: true
        layoutX: 5
        layoutY: 35
        content: [
            VBox {
                hpos: HPos.LEFT
                content: [
                    Text {
                        fill: Color.BLACK
                        font:Font { size: 12 }
                        content: bind "{nombre}"
                        cursor: Cursor.HAND
                         },
                    Text {
                        fill: Color.BLACK
                        font:Font { size: 12 }
                        content: bind "Unidades : {unidades}"
                        cursor: Cursor.HAND
                    },
                    Text {
                        fill: Color.BLACK
                        font:Font { size: 12 }
                        content: bind "Rango: {rangoMin} - {rangoMax} {unidades}"
                        cursor: Cursor.HAND
                    },
                    Text {
                        fill: Color.BLACK
                        font:Font { size: 12 }
                        content: bind "Resolución: {resolucion} {unidades}"
                        cursor: Cursor.HAND
                    },
                ]
            }
            ImageView {
                layoutX: 420-100
                image: bind Image {
                    height: 70
                    width: 70
                    url: "{__DIR__}recursos/{imagen}"
                }
            }
        ]
        cursor: Cursor.HAND
    }
    public function clonar(sen:sensorNodeAN):Void{
        nombre=sen.nombre;
        imagen=sen.imagen;
        unidades=sen.unidades;
        corte=sen.corte;
        pendiente=sen.pendiente;
        resolucion=sen.resolucion;
        rangoMin=sen.rangoMin;
        rangoMax=sen.rangoMax;
    }
    public override function create():Node {
        return Group {
            content: [
                detalles,
            ]
        };
    }
    public function hacer():sensorAN{
        var sens:sensorAN=sensorAN{};
        sens.nombre=this.nombre;
        sens.imagen=this.imagen;
        sens.unidades=this.unidades;
        sens.corte=this.corte;
        sens.pendiente=this.pendiente;
        sens.resolucion=this.resolucion;
        sens.rangoMin=this.rangoMin;
        sens.rangoMax=this.rangoMax;
        return sens;

    }
}
   /*SensorAN: Clase que define un sensor analogo. Incluye una
    *función de copia*/
public class sensorAN{
    public var nombre:String="";
    public var imagen:String="";
    public var unidades:String="";
    public var corte:Number=0;
    public var pendiente:Number=0;
    public var resolucion:Number=0;
    public var rangoMin:Number=0;
    public var rangoMax:Number=0;
    public function copiar(s:sensorAN):Void{
        nombre=s.nombre;
        imagen=s.imagen;
        unidades=s.unidades;
        corte=s.corte;
        pendiente=s.pendiente;
        resolucion=s.resolucion;
        rangoMin=s.rangoMin;
        rangoMax=s.rangoMax;
    }

}
  /* Conjunto de sensores básicos predefinidos.
   * TODO: extraer esta información de un archivo
   * para incluir sensores fácilmente.*/
public-read def SENSORES_INFO = [
    sensorNode {
        nombre: "Fotopuerta Simple"
        imagen: "fotopuerta_simple.png"
        tipoInterrupcion: false
        regleta: 20
    },
    sensorNode {
        nombre: "Fotopuerta Intercalada"
        imagen: "fotopuerta_intercalada.png"
        tipoInterrupcion: true
        regleta: 10
    },
    sensorNode {
        nombre: "Polea"
        imagen: "polea.png"
        tipoInterrupcion: true
        regleta: 10
    },
];
public-read def SENSORES_INFO_AN = [
        sensorNodeAN {
        nombre: "Voltímetro"
        imagen: "Voltimetro.png"
        unidades: "[V]"
        corte: -10
        pendiente:0.0195
        resolucion: 0.0195
        rangoMin: -10
        rangoMax: 10
    },
            sensorNodeAN {
        nombre: "Amperímetro"
        imagen: "Amperimetro.png"
        unidades: "[A]"
        corte: -1
        pendiente:0.00195
        resolucion: 0.00195
        rangoMin: -1
        rangoMax: 1
    },
            sensorNodeAN {
        nombre: "Barómetro"
        imagen: "Barometro.png"
        unidades: "[Pa]"
        corte:0
        pendiente:195.3
        resolucion:195.3
        rangoMin:0
        rangoMax:200000
    },
            sensorNodeAN {
        nombre: "Termómetro"
        imagen: "Termometro.png"
        unidades:"[°K]"
        corte:0
        pendiente:0.491
        resolucion:0.5
        rangoMin:-253
        rangoMax:423
    },

];
